package pub.tbc.toolkit.proxy;

import org.joda.time.DateTime;
import pub.tbc.toolkit.DateFormats;
import pub.tbc.toolkit.Objs;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author tbc on 2016/11/20 20:28.
 */
@SuppressWarnings("unchecked")
public class ProxyFactory {
    /**
     * 通过JDK提供的动态代理支持返回代理对象
     *
     * @param target    被代理的实现类
     * @param operation 封装了操作的前置和后置方法
     * @param <T>       返回类型
     * @return result   代理对象
     */
    public static <T> T newJdkDynamicProxy(final Object target, final ProxyOperation operation) {
        if (Objs.isEmpty(target))
            return null;

        return (T) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    private long startTime;

                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // proxy no use?
                        if (Objs.nonEmpty(operation))
                            return surround(operation, method, args);
                        return method.invoke(target, args);
                    }

                    private Object surround(ProxyOperation operation, Method method, Object[] args) throws Throwable {
                        operation.before();
                        Object result = method.invoke(target, args);
                        operation.after();
                        return result;
                    }

                });
    }

    /**
     * 通过CGLib提供的动态代理支持返回代理对象
     *
     * @param tClass    被代理的类型
     * @param operation 封装了操作的前置和后置方法
     * @param <T>       返回类型
     * @return result   代理对象
     */
    public static <T> T newCGLibProxy(final Class<T> tClass, final ProxyOperation operation) {

        return null;
    }
}
